#ifndef TASK_TIMERQUEUE_H
#define TASK_TIMERQUEUE_H

#include "copy/noncopyable.h"
#include "Timestamp.h"
#include "Channel.h"

#include <map>
#include <set>
#include <vector>
#include <functional>

class EventLoop;
class Timer;
class TimerId;

typedef std::function<void()> TimerCallback;

class TimerQueue : muduo::noncopyable{
public:

    /**
     * 构造函数, 将时间事件绑定事件循环
     * @param loop
     */
    TimerQueue(EventLoop * loop);

    ~TimerQueue();

    /**
     * 添加事件事件
     * @param cb 回调函数
     * @param when 调用事件
     * @param interval 调用间隔
     * @return 返回一个标识
     */
    TimerId addTimer(const TimerCallback & cb, Timestamp when, double interval);

    /**
     * 通过标识符取消对应的时间事件
     * @param timerId 对应的时间时间标识符
     */
    void cancel(TimerId timerId);

private:
    typedef std::pair<Timestamp, Timer *> Entry;
    typedef std::set<Entry> TimerList;

    void addTimerInLoop(Timer *timer);
    void handleRead();

    std::vector<Entry> getExpired(Timestamp now);

    void reset(const std::vector<Entry> & expired, Timestamp now);

    bool insert(Timer * timer);

    EventLoop * loop_;

    const int timerfd_;

    Channel timerfdChannel_;

    TimerList timers_;

    bool callingExpiredTimers_;



 //   void cancelInLoop(TimerId timerId);
};



#endif
